package cn.edu.lcvc.ebuy_23rj2.service;

import cn.edu.lcvc.ebuy_23rj2.dao.AdminDao;
import cn.edu.lcvc.ebuy_23rj2.model.Admin;
import cn.edu.lcvc.ebuy_23rj2.model.query.AdminQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 专门用于处理管理员的业务
 */
@Service //<bean id="AdminService" class="cn.edu.lcvc.ebuy_23rj2.service.AdminService"/>
public class AdminService {

    @Autowired
    private AdminDao adminDao;

    public AdminService(){
        System.out.print("AdminService初始化");
    }



    /**
     * 登录业务
     * @param username 账户名
     * @param password 密码
     * @return 如果密码正确则返回true,如果密码错误则返回false
     */
//    public boolean login(String username,String password){
//        boolean result=false;//默认登录失败
//        if(username.equals("user")&&password.equals("123")){
//            result=true;
//        }s
//        return result;
//    }

    /**
     * 登录业务
     * @param username 账户名
     * @param password 密码
     * @return 如果密码正确则返回true,如果密码错误则返回false
     */
    public boolean login(String username,String password) {
        boolean result=false;//默认登录失败
        if (adminDao.countByUsernameAndPassword(username,password)>0){
            result=true;
        }
        return result;
        //从数据库中判定账户名和密码是否正确
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        ResultSet rs=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中判定账户名和密码是否正确
//            String sql="select count(1) as num from admin where username=? and password=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setString(1,username);//第一个参数1表示sql语句中的第一个？，第二个参数表示将username的值存入这个？中
//            pstmt.setString(2,password);//第一个参数2表示sql语句中的第二个？，第二个参数表示将password的值存入这个？中
//            rs = pstmt.executeQuery();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//            if(rs.next()){//rs.next()表示下一条记录，用在此处的这个业务中表示如果有记录存在，即登录成功
//                if (rs.getInt("num")>0){
//                    result=true;
//                }
//            }
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,rs);
//        return result;
    }


    /**
     * 根据账户名在数据库读取指定账户的所有信息
     * @param username
     * @return
     */
    public Admin getAdminByUsername(String username){
        return adminDao.getByUsername(username);
//
//        Admin admin=null;//表示默认找不到记录，即null
//        // 从数据库中根据账户名读取对应的姓名信息
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        ResultSet rs=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中根据账户名读取对应的姓名信息
//            String sql="select * from admin where username=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setString(1,username);//第一个参数1表示sql语句中的第一个？，第二个参数表示将username的值存入这个？中
//            rs = pstmt.executeQuery();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//            if(rs.next()){//rs.next()表示下一条记录
//                admin=new Admin();
//                admin.setId(rs.getInt("id"));
//                admin.setUsername(rs.getString("username"));
//                admin.setPassword(rs.getString("password"));
//                admin.setName(rs.getString("name"));//表示从数据库的结果中把字段名为name的姓名返回
//                admin.setSex(rs.getInt("sex"));
//                admin.setUnLocked(rs.getBoolean("unLocked"));
//                admin.setPhoto(rs.getString("photo"));
//                admin.setCreateTime(rs.getTimestamp("createTime"));
//            }
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,rs);
//        return admin;
    }

    /**
     * 返回管理员表中的所有记录
     * @param adminQuery
     * @return 空集合表示找不到
     */
    public List<Admin> getAdmins(AdminQuery adminQuery){
//        List<Admin> list=new ArrayList<>();
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        ResultSet rs=null;
//        try{//可能发生异常的代码放到try当中
//            //查询
//            if((username!=null&&username.trim().length()>0)&&(name!=null&&name.trim().length()>0)){//如果账户名不为空,并且姓名不为空
//                String sql="select * from admin where username like concat('%',?,'%') and name like concat('%',?,'%') order by createTime desc";
//                pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//                pstmt.setString(1,username);
//                pstmt.setString(2,name);
//            }else if(username!=null&&username.trim().length()>0){//如果账户名不为空,并且姓名为空
//                String sql="select * from admin where username like concat('%',?,'%')  order by createTime desc";
//                pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//                pstmt.setString(1,username);
//            }else if(name!=null&&name.trim().length()>0){//如果姓名不为空,并且账户名为空
//                String sql="select * from admin where name like concat('%',?,'%')  order by createTime desc";
//                pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//                pstmt.setString(1,name);
//            }else{//如果账户名、姓名都为空
//                String sql="select * from admin order by createTime desc";
//                pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            }
//            rs = pstmt.executeQuery();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//            while(rs.next()){//rs.next()表示下一条记录
//                Admin admin=new Admin();
//                admin.setId(rs.getInt("id"));
//                admin.setUsername(rs.getString("username"));
//                admin.setPassword(rs.getString("password"));
//                admin.setName(rs.getString("name"));//表示从数据库的结果中把字段名为name的姓名返回
//                admin.setSex(rs.getInt("sex"));
//                admin.setUnLocked(rs.getBoolean("unLocked"));
//                admin.setPhoto(rs.getString("photo"));
//                admin.setCreateTime(rs.getTimestamp("createTime"));
//                //把这个元素放到集合中
//                list.add(admin);
//            }
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,rs);
        return adminDao.find(adminQuery);
    }

    /**
     * 删除指定账号
     * 说明：当前登录账号不能删除自己的账号
     * @param id
     * @return
     */
    public int deleteAdmin(Integer id){
//        int result=0;
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中根据账户名读取对应的姓名信息
//            String sql="delete from admin where id=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setInt(1,id);
//            result = pstmt.executeUpdate();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,null);
        int result=0;
        if (id!=null){
            result=adminDao.deleteById(id);
        }
        return result;
    }

    /**
     * 添加账户
     * @param admin 账户对象，要添加的表单应该都赋值到这个对象
     * @return 添加成功的记录数量
     */
    public int saveAdmin(Admin admin){
        int result=0;
        if (admin!=null){
            admin.setPassword("123456");
            result=adminDao.save(admin);
        }
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中根据账户名读取对应的姓名信息
//            String sql="insert into admin(username,password,name,sex,unLocked,createTime) values(?,?,?,?,?,now())";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setString(1,admin.getUsername());
//            pstmt.setString(2,"123456");
//            pstmt.setString(3,admin.getName());
//            pstmt.setInt(4,admin.getSex());
//            pstmt.setBoolean(5,admin.getUnLocked());
//            result = pstmt.executeUpdate();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,null);
        return result;
    }

    /**
     * 判断存在几个相同的账户名
     * @param username
     * @return ture表示重名
     */
    public boolean countUsername(String username){
        boolean result=false;//默认不重名
        if (adminDao.countByUsername(username)>0){
            result=true;
        }
        //从数据库中判定账户名和密码是否正确
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        ResultSet rs=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中判定账户名和密码是否正确
//            String sql="select count(1) as num from admin where username=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setString(1,username);//第一个参数1表示sql语句中的第一个？，第二个参数表示将username的值存入这个？中
//            rs = pstmt.executeQuery();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//            if(rs.next()){//rs.next()表示下一条记录，用在此处的这个业务中表示如果有记录存在，即登录成功
//                if(rs.getInt("num")>0){//如果返回的值大于0，表示重名
//                    result=true;
//                }
//            }
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,rs);
        return result;
    }

    /**
     * 根据id在数据库读取指定账户的所有信息
     * @param id
     * @return
     */
    public Admin getAdminById(Integer id){
        Admin admin=null;//表示默认找不到记录，即null
        if (id!=0){
            admin=adminDao.findById(id);
        }
        // 从数据库中根据账户名读取对应的姓名信息
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        ResultSet rs=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中根据账户名读取对应的姓名信息
//            String sql="select * from admin where id=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setInt(1,id);//第一个参数1表示sql语句中的第一个？，第二个参数表示将username的值存入这个？中
//            rs = pstmt.executeQuery();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//            if(rs.next()){//rs.next()表示下一条记录
//                admin=new Admin();
//                admin.setId(rs.getInt("id"));
//                admin.setUsername(rs.getString("username"));
//                admin.setPassword(rs.getString("password"));
//                admin.setName(rs.getString("name"));//表示从数据库的结果中把字段名为name的姓名返回
//                admin.setSex(rs.getInt("sex"));
//                admin.setUnLocked(rs.getBoolean("unLocked"));
//                admin.setPhoto(rs.getString("photo"));
//                admin.setCreateTime(rs.getTimestamp("createTime"));
//            }
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,rs);
        return admin;
    }

    /**
     * 编辑账户
     * @param admin 账户对象，要添加的表单应该都赋值到这个对象
     * @return 编辑成功的记录数量
     */
    public int updateAdmin(Admin admin){
        int result=0;
        if (admin!=null){
            result=adminDao.update(admin);
        }
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中根据账户名读取对应的姓名信息
//            String sql="update admin set username=?,name=?,sex=?,unLocked=? where id=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setString(1,admin.getUsername());
//            pstmt.setString(2, admin.getName());
//            pstmt.setInt(3,admin.getSex());
//            pstmt.setBoolean(4,admin.getUnLocked());
//            pstmt.setInt(5,admin.getId());
//            result = pstmt.executeUpdate();//executeUpdate执行记录的变更：将sql语句解析后发送到mysql数据库，并将影响的行的数量返回
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,null);
        return result;
    }

    /**
     * 判断存在几个相同的账户名
     * @param username
     * @return ture表示重名
     */
    public boolean countByUsernameAndNotId(String username,Integer id){
        boolean result=false;//默认不重名
        if (adminDao.countByUsernameAndNotId(username, id)){
            result=true;
        }
        //从数据库中判定账户名和密码是否正确
//        Connection connection=DBHelper.getConnection();
//        PreparedStatement pstmt=null;
//        ResultSet rs=null;
//        try{//可能发生异常的代码放到try当中
//            //3.操作数据库：从数据库中判定账户名和密码是否正确
//            String sql="select count(1) as num from admin where username=? and id!=?";
//            pstmt = connection.prepareStatement(sql);//prepareStatement函数表示将sql封装，准备发送到mysql数据库
//            pstmt.setString(1,username);//第一个参数1表示sql语句中的第一个？，第二个参数表示将username的值存入这个？中
//            pstmt.setInt(2,id);
//            rs = pstmt.executeQuery();//executeQuery执行查询：将sql语句解析后发送到mysql数据库，并将查询结果返回
//            if(rs.next()){//rs.next()表示下一条记录，用在此处的这个业务中表示如果有记录存在，即登录成功
//                if(rs.getInt("num")>0){//如果返回的值大于0，表示重名
//                    result=true;
//                }
//            }
//        }catch (Exception e){//如果try里面运行的时候出现错误，那么会执行catch里面的代码
//            e.printStackTrace();
//        }
//        //4.关闭数据库
//        DBHelper.closeConn(connection,pstmt,rs);
        return result;
    }
 }
